home *** CD-ROM | disk | FTP | other *** search
/ MIDICraft's MIDINET CD-ROM / MIDICraft's MIDINET CD-ROM.iso / DOSUTILS / KORG / GETDUMP.CPP < prev    next >
C/C++ Source or Header  |  1996-11-01  |  4KB  |  225 lines

  1. // getdump: decode korg dump
  2. #include <stdio.h>
  3. #include <conio.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6. #include <time.h>
  7. #include "sb.hpp"
  8. #include "filei3.hpp"
  9.  
  10. Soundcard* card = 0;
  11. FILE* f = 0;
  12.  
  13. int raw = 0;
  14. int decodeany = 0;
  15.  
  16. unsigned char buf[32000];
  17. int buflen = 0;
  18. long skip = 0;
  19.  
  20. void flushbuf()
  21. {
  22.   if (buflen > 0)
  23.     if (fwrite(buf, buflen, 1, f) != 1)
  24.       fprintf(stderr, "write error\n");
  25.  
  26.   buflen = 0;
  27. }
  28.  
  29. void add(FILE* f, unsigned char* s, int len, int encoded)
  30. {
  31.   if (buflen + 7 > sizeof(buf))
  32.     flushbuf();
  33.   if (encoded)
  34.     len = code8to7(s, len, buf+buflen);
  35.   else
  36.   {
  37.     memcpy(buf+buflen, s, len);
  38.   }
  39.   if (len > 0)
  40.     buflen += len;
  41. }
  42.  
  43. int hear()
  44. {
  45.   card->reset();
  46.   unsigned char c;
  47.   int ret = 0;
  48.  
  49.  fprintf(stderr, "send any dump from korg i3:\n");
  50.   card->startinput();
  51.   int record = 0;
  52.   unsigned char dumpdata[8];
  53.   unsigned char head[5];
  54.   char filename[14];
  55.   int dumplen = 0;
  56.   int headlen = 0;
  57.   int func = 0;
  58.   int encoded = 0;
  59.   char* typ = 0;
  60.   f = 0;
  61.  
  62.   while (!kbhit() || getch() != 27)
  63.   {
  64.     int count = card->hear(&c, 1);
  65.     if (count <= 0)
  66.       continue;
  67.     ret = 1;
  68.  
  69.     if (!record)
  70.     {
  71.       if (c == 0xF0)
  72.       {
  73.     record = 1;
  74.     head[0] = c;
  75.     headlen = 1;
  76.       }
  77.       // ignore
  78.       continue;
  79.     }
  80.     // recording
  81.     if (headlen > 0 && head[0] == 0xf0 && headlen < 5)
  82.     {
  83.       if (headlen < 5)
  84.     head[headlen++] = c;
  85.  
  86.       if (headlen == 5)
  87.       {
  88.     printf("F0 %02X %02X %02X %02X ... ",
  89.        head[1], head[2], head[3], head[4]);
  90.     func = c;
  91.     skip = 0;
  92.     encoded = 1;
  93.     typ = 0;
  94.     switch(c)
  95.     {
  96.     case 0x40: break;
  97.     case 0x4c: typ = "prg"; break;
  98.     case 0x64: typ = "arr"; break;
  99.     case 0x65: typ = "sty"; break;
  100.     case 0x48: skip = 2; typ = "sng"; break;
  101.     case 0x39: break;
  102.     case 0x51: typ = "glb"; break;
  103.     case 0x52: typ = "dkt"; break;
  104.     case 0x50: skip = 4, typ = "all"; break;
  105.     case 0x66: skip = 2; typ = "bsq"; break;
  106.     default:
  107.       encoded = 0;
  108.       break;
  109.     }
  110.     if (decodeany)
  111.     {
  112.       encoded = 1;
  113.     }
  114.     if (raw)
  115.     {
  116.       skip = 0;
  117.       encoded = 0;
  118.     }
  119.     flushbuf();
  120.     dumplen = 0; // data starts
  121.  
  122.     if (typ)
  123.        sprintf(filename, "dump%s.dat", typ);
  124.     else
  125.        sprintf(filename, "dump%02X.dat", func);
  126.     f = fopen(filename, "wb");
  127.     if (!f)
  128.     {
  129.       perror(filename);
  130.       return 0;
  131.     }
  132.       }
  133.       continue;
  134.     }
  135.     if (c == 0xf7)
  136.     {
  137.       if (f && dumplen >  0)
  138.     add(f, dumpdata, dumplen, encoded);
  139.       dumplen = 0;
  140.       flushbuf();
  141.       fclose(f); f = 0;
  142.  
  143.       printf("F7\t");
  144.       switch(func)
  145.       {
  146.       case 0x41:  printf("parameter change\n"); break;
  147.       case 0x48:  printf("all song data dump\n"); break;
  148.       case 0x4c:  printf("all program data dump\n"); break;
  149.       case 0x4e:  printf("mode change %d\n", dumpdata[0]); break;
  150.       case 0x52:  printf("drumkit data dump\n"); break;
  151.       case 0x51:  printf("global data dump\n"); break;
  152.       case 0x50:  printf("all data dump\n"); break;
  153.       case 0x53:  printf("drumkit parameter change\n"); break;
  154.       case 0x64:  printf("all arrangement data dump\n"); break;
  155.       case 0x65:  printf("all style data dump\n"); break;
  156.       case 0x66:  printf("all backing sequence data dump\n"); break;
  157.       default:
  158.      printf("unknown sysex\n");
  159.      break;
  160.       }
  161.       record = 0;
  162.       headlen = 0;
  163.       continue;
  164.     }
  165.     if (skip > 0)
  166.     {
  167.       add(f, &c, 1, 0);
  168.       skip--;
  169.     }
  170.     else
  171.     {
  172.       dumpdata[dumplen++] = c;
  173.       if (dumplen >= 8)
  174.       {
  175.     if (f)
  176.       add(f, dumpdata, dumplen, encoded);
  177.     dumplen = 0;
  178.       }
  179.     }
  180.   }
  181.   if (f)
  182.   {
  183.     if (dumplen >  0)
  184.       add(f, dumpdata, dumplen, encoded);
  185.     flushbuf();
  186.     fclose(f); f = 0;
  187.   }
  188.   card->stopinput();
  189.   return ret;
  190. }
  191.  
  192. int main(int argc, char** argv)
  193. {
  194.   argc--; argv++;
  195.   while (argc > 0 && **argv == '-')
  196.   {
  197.     if (strnicmp(*argv, "-raw", 4) == 0)
  198.     {
  199.       raw = 1;
  200.       argc--; argv++;
  201.       continue;
  202.     }
  203.     if (strnicmp(*argv, "-decode", 2) == 0)
  204.     {
  205.       decodeany = 1;
  206.       argc--; argv++;
  207.       continue;
  208.     }
  209.     fprintf(stderr, "invalid option %s\n", *argv);
  210.     argc--; argv++;
  211.   }
  212.   card = detect_soundcard();
  213.   if (!card)
  214.   {
  215.     fprintf(stderr, "Could not detect soundcard\n");
  216.     return 1;
  217.   }
  218.  
  219.   if (!hear())
  220.     fprintf(stderr, "no response from soundcard\n");
  221.  
  222.   delete card;
  223.   return 0;
  224. }
  225.